package com.deewin.study.designmodle;

import java.util.ArrayList;
import java.util.List;

class Observer {

    List<Audience> audiences  = new ArrayList<Audience>();

    String movies = "";

    public void  setMovies(String chagne){
        this.movies = chagne;
        gotoNotifyAll();
    }

    void gotoNotifyAll(){
        for (Audience a:audiences) {
            a.update(this.movies);
        }
    }

    public void addAudiences(Audience audience){
        audiences.add(audience);
    }


}

interface Audience{
    void update(String chagne);
}

class girleA implements Audience{

    @Override
    public void update(String change) {
        System.out.println("我是 A女孩，我知道了，是不是更新了"+ change+"电视剧？");
    }
}

class girleB implements Audience{

    @Override
    public void update(String change) {
        System.out.println("我是 B女孩，我知道了，是不是更新了"+ change+"电视剧？");
    }
}

class girleC implements Audience{

    @Override
    public void update(String change) {
        System.out.println("我是 C女孩，我知道了，是不是更新了"+ change+"电视剧？");
    }
}

/**
 * 应用场景：
 * 有一些实体类，他们作为观察者，去观察一个事物的状态，如果这个事物的状态改变了，这些观察者就哟啊相应的做出一些改变，不需要知道是谁来观察他，
 * 也不需要知道多少个观察者
 *
 * 代码使用场景：
 * A a；
 * a.setxxx(yyy);
 * subA,subB,subC .... 相应做出动作。
 *
 *设计思想：
 *
 * 被观察的类
 * {
 *     1，他的一个状态
 *     2，观察这个类的一些subjiec（类似于观察者注册在这个类中）
 *     3，对这个状态做出改变，这些观察者他们要相应的做出动作，调用这些观察者的相应方法
 *     4，这些观察者要抽象出一个接口，这个观察者都实现这个接口，方便让被观察者类调用
 *     5，实例子化这个观察者，并注册到被观察者中。
 *     6，改变被观察者的状态。
 *     7，观察者做出相应的动作。
 * }
 *
 */
public class ObserverTest{
    public static void main(String[] args) {
        Observer observer = new Observer();

        girleA ga = new girleA();
        girleB gb = new girleB();
        girleC gc = new girleC();

        observer.addAudiences(ga);
        observer.addAudiences(gb);
        observer.addAudiences(gc);

        observer.setMovies("还珠格格1-3");

    }
}